function payments(){}
payments.prototype = {
    paymentMethod : undefined,
    modal : undefined,
    paymendMethod: undefined,
    paymentType: undefined,
    formatNumber : function (number)
    {
        number = number.toFixed(2) + '';
        x = number.split('.');
        x1 = x[0];
        x2 = x.length > 1 ? ',' + x[1] : '';
        var rgx = /(\d+)(\d{3})/;
        while (rgx.test(x1)) {
            x1 = x1.replace(rgx, '$1' + '.' + '$2');
        }
        return x1 + x2;
    },
    setPaymentMethod : function (methodId, orderId){
        if(methodId == '')
            return;
        var thisObject = this;
        if ($('#card_number').attr("disabled") != 'disabled')
            thisObject.disableForm();
        ajaxLoader.ajaxStart();
        $.ajax({
            url: '/payment/set-payment-method?order='+orderId,
            data: {method: methodId},
            method: 'post',
            dataType: 'json',
            success: function(json) {
                thisObject.paymendMethod = methodId;
                ajaxLoader.ajaxStop();
                var modal  = new Modal({
                    title: json.title,
                    body : json.body,
                    buttonOK : false,
                    dismissButton : false,
                    cancelText : translate['payment-select-access-method-cancel'],
                    dataKeyboard : false
                });
                thisObject.modal = modal;
                modal.show();
            }
        });
    },
    selectAccessMethod: function(methodId, methodName, installments, discount){
        $('.bandeiras img').removeClass('focus');
        $('#access-method-text').html('
'+methodName+'
');
        $('#access_method').val(methodId);
        $('#payment_method').val(this.paymendMethod);
        $('.bandeiras img').addClass('new');
        $('#payment-method-'+this.paymendMethod).addClass('focus');
        if(installments > 0){
            this.addInstallments(installments, discount);
        }else{
            this.removeInstallments(installments);
        }
        this.showFieldNameByAccessMethod(methodId);
        this.removeDisabledForm();
        this.checkPaymentButton();
        this.modal.hide();
        $('#card_number').focus();
    },
    setBoxOffice: function(paymendMethod, event, accessMethod) {
        ajaxLoader.ajaxStart();
        $('.bandeiras img').removeClass('focus');
        $('#access-method-text').html('Retirar ingresso na bilheteria
');
        $('#access_method').val(accessMethod);
        $('#payment_method').val(paymendMethod);
        $('.bandeiras img').addClass('new');
        $('#payment-method-'+paymendMethod).addClass('focus');
        let thisObject = this;
        $.ajax({
            url: '/payment/get-installments?method='+paymendMethod+'&event='+event,
            method: 'get',
            dataType: 'json',
            success: function(json) {
                ajaxLoader.ajaxStop();
                
                if(json.installments > 0){
                    thisObject.addInstallments(json.installments);
                } else {
                    thisObject.removeInstallments();
                }
            }
        });
        this.showFieldNameByAccessMethod(1);
        this.removeDisabledForm();
        this.checkPaymentButton();
        $('#card_number').focus();
    },
    checkPaymentButton : function(){
        if($('.g-recaptcha-response').val() != "" && $('#payment_method').val() != ""){
            $('#payment-submit').removeAttr('disabled');
            $('#payment-submit').removeClass('disabled');
        }
    },
    
    removeDisabledForm : function(){
        $('#card_number').removeAttr('disabled');
        $('#card_name').removeAttr('disabled');
        $('#cvv').removeAttr('disabled');
        $('#expire').removeAttr('disabled');
    },
    disableForm : function(){
        $('#card_number').prop("disabled", true);
        $('#card_name').prop("disabled", true);
        $('#cvv').prop("disabled", true);
        $('#expire').prop("disabled", true);
    },
    addInstallments : function(installments, discount){
        $('#installments').html('');
        $('#installments').attr('onChange', 'payments.applyInstallmentsDiscount()');
        var totalOrder = $('#total-order').val();
        var installmentValue = totalOrder;
        $('#installments').append('');
        for(i = 1; i <= installments; i ++){
            installmentValue = totalOrder / i;
            discountText = '(Desconto à vista)';
            if(i===1 && discount > 0){
                $('#installments').append('');
            }else{
                $('#installments').append('');
            }
        }   
        $('#installments').removeAttr('disabled');
        $('#installments').parents('div.form-group').show();
    },
    removeInstallments : function(installments){
        $('#installments').attr('disabled', true);
        $('#installments').parents('div.form-group').hide();
    },
    applyInstallmentsDiscount : function() {
        var installmentValue = $('#installments').find(":selected").val();
        var orderId = $('#order').val();
        var paymentMethod = this.paymendMethod;
        ajaxLoader.ajaxStart();
        $.ajax({
            url: '/payment/insert-installments-discount',
            data: {installment: installmentValue, orderId: orderId, paymentMethod: paymentMethod},
            method: 'post',
            dataType: 'json',
            success: function(json) {
                if(json.status) {
                    $('#orderTotalLabel').html('R$ '+ json.data.orderValue);
                    $('#totalDiscountLabel').html(" - " + json.data.totalDiscountValue);
                    $('#payment_method').val(json.data.paymentMethod);
                    $('#totalConvenienceLabel').html(" + " + json.data.totalConvenienceFee);
                    $.each(json.data.tickets, function(index, value){
                        $('.desc-'+value['ing_codigo']).html(value['discountValue']);
                        $('.total-'+value['ing_codigo']).html(value['ticketValue']);
                    });
                }
                ajaxLoader.ajaxStop();
            }
        });
        this.checkPaymentButton();
    },
    registerDocument : function(ticketId)
    {
        var payment = this;
        var modal = new Modal({
           title: translate["payment-js-register-document"],
           body: this.registerDocumentFields(ticketId),
           confirm: function(){payment.insertDocument(ticketId, payment.modal)}
        });
        this.modal = modal;
        this.modal.show();
    },
    showFieldNameByAccessMethod: function(methodId){
        $("input[id^=ticket]").each(function(){
            var ticketId = this.id.split("_")[1];
            if(methodId == 3){
                var document = $("#document"+ticketId).val();
                var element = "";
                $("#name"+ticketId).html(element);
            }else{
                $("#name"+ticketId).html($("#defaultName"+ticketId).val());
            }
        });
    },
    registerDocumentFields: function(ticketId){
        var modalBody =     '';
        return modalBody;
    },
    insertDocument: function(ticketId, modal){
        var name = $("#icd_nome"+ticketId).val();
        var document = $("#icd_rg"+ticketId).val();
        if (name.length && document.length)
        {
            $.getJSON('/payment/register-document-print-at-home', {
                name : name,
                document : document,
                ticket: ticketId
            }, function(json) {
                    if (json.success === true) {
                        $('#doc_' + ticketId).html(name + '
' + document);
                        $("#document"+ticketId).val(name + '
' + document);
                        modal.hide();
                    } else {
                        $.each(json.errors, function(key, value){
                            //TODO: print error
                        });
                    }
            });
        }
    },
    ExpireOrder : function (orderId){
        ajaxLoader.ajaxStart();
        
        setTimeout(function(){
            $.ajax({
                url: '/payment/expire-order?order='+orderId,
                method: 'post',
                dataType: 'json',
                success: function(json) {
                    ajaxLoader.ajaxStop();
                    if(json.success){
                        window.location.href = json.url;
                    }else{
                        window.location.reload();
                    }
                }
            });
        }, 3000);
    },
    selectWithdrawnMethod: function(withdrawnMethod, orderId){
        ajaxLoader.ajaxStart();
        // var withdrawnMethod = $('#withdrawnMethod').val();
        // var orderId = $('#withdrawnMethod').data('order');
        
        $.ajax({
            url: '/payment/set-withdrawn-method?order='+orderId,
            data: {method: withdrawnMethod},
            method: 'post',
            dataType: 'json',
            success: function(json) {
                if(json.success === true){
                    $('.btn-checkin').css("pointer-events", "");
                    $('.btn-checkin').removeAttr("disabled");
                }else{
                    $('.btn-checkin').attr("disabled", "disabled");
                    $('.btn-checkin').css("pointer-events", "none");
                }
                ajaxLoader.ajaxStop();
            },
            error: function(json){
                $('.btn-checkin').attr("disabled", "disabled");
                $('.btn-checkin').css("pointer-events", "none");
                ajaxLoader.ajaxStop();
            }
        });  
    },
    
    finishPaymentCheckin: function (orderId, eventId){
        ajaxLoader.ajaxStart();
        
        $.ajax({
            url: '/payment/finish-payment-checkin',
            data: {eventId: eventId, orderId: orderId},
            method: 'post',
            dataType: 'json',
            success: function(json){
                ajaxLoader.ajaxStop(); 
                window.location.href = '/order/index?order='+orderId;
            }, 
            error: function (json){
                ajaxLoader.ajaxStop();
                alert(json.message);
            }
        });
    },
    
    finishMemberPaymentCheckin: function (orderId, eventId){
        var withdrawnMethod = $('#withdrawnMethod').val();
        if (withdrawnMethod === null || withdrawnMethod === '') {
            alert('Selecione uma forma de retirada');
            return;
        }
        
        ajaxLoader.ajaxStart();
        $.ajax({
            url: '/payment/finish-payment-member-checkin',
            data: {eventId: eventId, orderId: orderId},
            method: 'post',
            dataType: 'json',
            success: function(json){
                ajaxLoader.ajaxStop(); 
                window.location.href = '/order/index?order='+orderId;
            }, 
            error: function (json){
                ajaxLoader.ajaxStop();
                alert(json.message);
            }
        });
    },
    showImage: function(ticketId, productId) {
        let src = document.getElementById('thumb_' + productId).src;
        let name = document.getElementById('name' + ticketId);
        console.log(ticketId);
        var modal  = new Modal({
            title: name.dataset.name,
            body : '
',
            buttonOK : false,
            dismissButton : false,
            cancelText : 'OK',
            dataKeyboard : false
        });
        modal.show();
    },
    setUserCpfOnSession(link) {
        let userCpf = document.getElementById('user_cpf').value;
        $.ajax({
            url: '/payment/set-user-cpf',
            data: {user_cpf: userCpf},
            method: 'post',
            dataType: 'json',
            success: function(json) {
                ajaxLoader.ajaxStop();
                window.open(link, '_blank');
            },
            error: function (json){
                ajaxLoader.ajaxStop();
                alert(json.message);
            }
        });
    },
    fcSelectAccessMethod: function(accessId) {
        let accessMethodSelected = accessId;
        let formAccessMethod = document.getElementsByName('access_method')[0];
        this.fcToggleFacialTerm(false);
        this.fcToggleAccessButton(false);
        formAccessMethod.value = accessMethodSelected;
    },
    
    fcToggleAccessButton: function(disabled) {
        let accessButton = document.getElementById('accessMethodButton');
        if(disabled) {
            accessButton.disabled = true;
        } else {
            accessButton.disabled = false;
        }
    },
    fcToggleFacialTerm: function(show) {
        let facialTerm = document.getElementById('facial-check');
        if(facialTerm === null) return;
        if(show) {
            facialTerm.classList.remove("d-none");
            this.fcToggleAccessButton(true);
            document.getElementById('agree_check_facial').checked = false;
            return;
        }
        facialTerm.classList.add("d-none");
    },
    fcCheckFacialTerm: function(accessId) {
        let checkTerm = document.getElementById('agree_check_facial');
        if(checkTerm.checked) {
            this.fcToggleAccessButton(false);
            document.getElementsByName('access_method')[0].value = accessId;
            return;
        }
        this.fcToggleAccessButton(true);
    },
    fcChangePaymentMethod: function(event, paymentFlag) {
        let formPaymentFlag = paymentFlag;
        let formPaymentButtonList = document.querySelector('.card_payment--types');
        let formPaymentButtons = document.querySelectorAll('.card_payment--types button');
        let debitCardFlags = document.getElementById('debit-cardFlags');
        let creditCardFlags = document.getElementById('credit-cardFlags');
        this.paymentType = paymentFlag;
        $('[name=card_name]').removeAttr('disabled');
        $('[name=cvv]').removeAttr('disabled');
        $('[name=expire]').removeAttr('disabled');
        $('[name=card_number]').removeAttr('disabled');
        
        if (formPaymentFlag === 'debit') {
            if(debitCardFlags){
                debitCardFlags.classList.remove('d-none');
            }
            if(creditCardFlags){
                creditCardFlags.classList.add('d-none');
            }
            
            this.removeInstallments();
        } else if (formPaymentFlag === 'credit') {
            if(creditCardFlags){
                creditCardFlags.classList.remove('d-none');
            }
            if(debitCardFlags){
                debitCardFlags.classList.add('d-none');
            }
        }
        formPaymentButtons.forEach((e) => {
            e.classList.remove('ativo');
        })
        formPaymentButtonList.classList.add('active');
		if( event ) {
        	event.target.classList.add('ativo');
		}
        $('.bandeiras img').removeClass('focus');
        $('.bandeiras img').removeClass('fc');
		// Atualiza form
		document.getElementById('card_selected_type').value = formPaymentFlag;
        // this.disableForm();
        // onCheckout();
		// // Trigger de bandeira, atualiza detecção ao selecionar outro tipo
		const inputCardNumber = document.getElementById('card_number');
		payments.detectCardType(inputCardNumber.value);
    },
    fcGetInstallments: function(orderId, methodId) {
        let thisObject = this;
        this.paymendMethod = methodId
        $.ajax({
            url: '/payment/get-installments?method='+methodId+'&orderId='+orderId,
            method: 'get',
            dataType: 'json',
            success: function(json) {
                ajaxLoader.ajaxStop();
                
                if(json.installments > 0){
                    thisObject.addInstallments(json.installments, json.installmentsDiscount);
                } else {
                    thisObject.removeInstallments();
                }
            }
        });
    },
    fcSetPaymentMethod: function(methodId, orderId) {
        $('.bandeiras img').removeClass('focus');
        $('.bandeiras img').addClass('new');
        $('#payment-method-'+methodId).addClass('focus');
        let thisObject = this;
        if(methodId == '')
            return;
        
        let formAccessMethod = document.getElementsByName('access_method')[0].value;
        let formPaymentMethod = document.getElementsByName('payment_method')[0];
        if ($('#card_number').attr("disabled") != 'disabled')
            this.disableForm();
        ajaxLoader.ajaxStart();
        $.ajax({
            url: '/payment/set-payment-method?order='+orderId,
            data: {method: methodId},
            method: 'post',
            dataType: 'json',
            success: function(json) {
                ajaxLoader.ajaxStop();
                if (methodId === 44) {
                    window.location.href = `${window.location.origin}/payment/pix?order=${orderId}&access-method=${formAccessMethod}`;
                } else if (methodId === 48) {
                    window.location.href = `${window.location.origin}/payment/view-cashback?order=${orderId}&access-method=${formAccessMethod}`;
                } else {
                    formPaymentMethod.value = methodId;
                    thisObject.fcGetInstallments(orderId, methodId);
                    thisObject.removeDisabledForm();
                }
            }
        });
    },
    // FC4 change Card Flag 
    allPaymentMethods: undefined,
    flagElement: undefined,
    flagDefaultIcon: undefined,
    baseUrlCdn: undefined,
    timer: undefined,
    flags: {
        credit: [
            {
                id: 5,
                name: 'amex', 
                regex: /^3[47]\d{13,14}$/,
            },
            {
                id: 18,
                name: 'discover', 
                regex: /^(?:6011\d{12})|(?:65\d{14})$/, 
            },
            {
                id: 14,
                name: 'elo', 
                regex: /^401178|^401179|^431274|^438935|^451416|^457393|^457631|^457632|^504175|^627780|^636297|^636369|^636368|^(506699|5067[0-6]\d|50677[0-8])|^(50900\d|5090[1-9]\d|509[1-9]\d{2})|^65003[1-3]|^(65003[5-9]|65004\d|65005[0-1])|^(65040[5-9]|6504[1-3]\d)|^(65048[5-9]|65049\d|6505[0-2]\d|65053[0-8])|^(65054[1-9]|6505[5-8]\d|65059[0-8])|^(65070\d|65071[0-8])|^65072[0-7]|^(65090[1-9]|65091\d|650920)|^(65165[2-9]|6516[6-7]\d)|^(65500\d|65501\d)|^(65502[1-9]|6550[3-4]\d|65505[0-8])|^(65092[1-9]|65097[0-8])/, 
            },
            {
                id: 36,
                name: 'hipercard', 
                regex: /^(606282\d{10}(\d{3})?)|(3841\d{15})$/, 
            },
            {
                id: 3,
                name: 'mastercard', 
                regex: /^5[1-5]\d{14}$|^2(?:2(?:2[1-9]|[3-9]\d)|[3-6]\d\d|7(?:[01]\d|20))\d{12}$/,
            },
            {
                id: 2,
                name: 'visa', 
                regex: /^(?!504175|506699|5067|509|6500|6501|4011(78|79)|43(1274|8935)|45(1416|7393|763(1|2))|50(4175|6699|67[0-6][0-9]|677[0-8]|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9])|627780|63(6297|6368|6369)|65(0(0(3([1-3]|[5-9])|4([0-9])|5[0-1])|4(0[5-9]|[1-3][0-9]|8[5-9]|9[0-9])|5([0-2][0-9]|3[0-8]|4[1-9]|[5-8][0-9]|9[0-8])|7(0[0-9]|1[0-8]|2[0-7])|9(0[1-9]|[1-6][0-9]|7[0-8]))|16(5[2-9]|[6-7][0-9])|50(0[0-9]|1[0-9]|2[1-9]|[3-4][0-9]|5[0-8])))4[0-9]{12}(?:[0-9]{3})?$/
            },
        ],
        debit: [
            {
                id: 15,
                name: 'elo', 
                regex: /^401178|^401179|^431274|^438935|^451416|^457393|^457631|^457632|^504175|^627780|^636297|^636369|^636368|^(506699|5067[0-6]\d|50677[0-8])|^(50900\d|5090[1-9]\d|509[1-9]\d{2})|^65003[1-3]|^(65003[5-9]|65004\d|65005[0-1])|^(65040[5-9]|6504[1-3]\d)|^(65048[5-9]|65049\d|6505[0-2]\d|65053[0-8])|^(65054[1-9]|6505[5-8]\d|65059[0-8])|^(65070\d|65071[0-8])|^65072[0-7]|^(65090[1-9]|65091\d|650920)|^(65165[2-9]|6516[6-7]\d)|^(65500\d|65501\d)|^(65502[1-9]|6550[3-4]\d|65505[0-8])|^(65092[1-9]|65097[0-8])/, 
            },
            {
                id: 7,
                name: 'maestro', 
                regex: /^(5[1-5]\d{14}|2(?:2(?:2[1-9]|[3-9]\d)|[3-6]\d\d|7(?:[01]\d|20))\d{12}|(?:5[0678]\d\d|6304|6390|67\d\d)\d{8,15}|(5[1-5]\d{4}|677189)\d{10})$/,
            },
            {
                id: 6,
                name: 'visaelectron', 
                regex: /^(?!504175|506699|5067|509|6500|6501|4011(78|79)|43(1274|8935)|45(1416|7393|763(1|2))|50(4175|6699|67[0-6][0-9]|677[0-8]|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9])|627780|63(6297|6368|6369)|65(0(0(3([1-3]|[5-9])|4([0-9])|5[0-1])|4(0[5-9]|[1-3][0-9]|8[5-9]|9[0-9])|5([0-2][0-9]|3[0-8]|4[1-9]|[5-8][0-9]|9[0-8])|7(0[0-9]|1[0-8]|2[0-7])|9(0[1-9]|[1-6][0-9]|7[0-8]))|16(5[2-9]|[6-7][0-9])|50(0[0-9]|1[0-9]|2[1-9]|[3-4][0-9]|5[0-8])))4[0-9]{12}(?:[0-9]{3})?$/
            },
        ]
    },
    setPaymentMethodsFlags: function(debit, credit, baseUrl) {
        debit = this.addFlagTypeToMethods('debit', debit);
        if(credit != null){
            credit = this.addFlagTypeToMethods('credit', credit);
            debit.push(...credit);
        }
        
        this.allPaymentMethods = debit;
        this.baseUrlCdn = baseUrl;
        
        this.flagElement = document.getElementById('flagImg');
        this.flagDefaultIcon = document.getElementById('flagDefaultIcon');
        thisObject = this;
        const inputCardNumber = document.getElementById('card_number');
        inputCardNumber.addEventListener('keyup', (e) => {
            clearTimeout(thisObject.timer);
            thisObject.timer = setTimeout(() => {
                payments.detectCardType(inputCardNumber.value);
            }, 1000);
        });
        inputCardNumber.addEventListener('paste', (e) => {
            clearTimeout(thisObject.timer);
            thisObject.timer = setTimeout(() => {
                payments.detectCardType(inputCardNumber.value);
            }, 500);
        });
    },
    addFlagTypeToMethods: function(type, arr) {
        for (let i = 0; i < arr.length; i++) {
            if(!arr[i].methods || !Array.isArray(arr[i].methods)) {
                arr[i].methods = []
            }
        
            arr[i].methods.push(type)
        }
        return arr;
    },
    detectCardType: function(number) {
        let flags = this.flags;
        // const tooltip = bootstrap.Tooltip.getOrCreateInstance(document.getElementById('flagDefaultIcon'))
        if(number.length > 3){
            let cardNumber = number.replace(/ /g,'');
            let flagId = '';
            let flagTypeArr = flags[this.paymentType];
            for(var key in flagTypeArr) {
                if(flagTypeArr[key].regex.test(cardNumber)) {
                    flagId = flagTypeArr[key].id;
                }
            }
            if (flagId !== '') {
                this.setFlagPaymentMethod(flagId);
                // tooltip.hide();
                this.toggleTooltip(false);
                return;
            }
            // tooltip.hide();
            this.toggleTooltip(false);
            if(number.length > 10 && flagId == ''){
                console.log('Bandeira não disponível');
                // tooltip.show();
                this.toggleTooltip(true);
                $("#submit-payment").attr('disabled', true);
            }
            this.toggleFlagImg(false);
        }else{
            // tooltip.hide();
            this.toggleTooltip(false);
            $("#submit-payment").attr('disabled', true);
        }
    },
    toggleTooltip: function(isShow) {
        const tooltip = bootstrap.Tooltip.getOrCreateInstance(document.getElementById('flagDefaultIcon'));
        if (isShow) {
            tooltip.show();
        } else {
            tooltip.hide();
        }
    },
    setFlagPaymentMethod: function(flagId) {
        $("#submit-payment").attr('disabled', false);
        let flagTypeObject =  this.allPaymentMethods.find(el => el.fop_codigo === `${flagId}`);
        if(flagTypeObject) {
            $('#payment_method').val(flagTypeObject.fop_codigo);
            this.fcGetInstallments($('#order').val(), flagTypeObject.fop_codigo);
            this.toggleFlagImg(true, flagTypeObject.fop_imagem)
        } else {
            $('#payment_method').val('')
            this.toggleFlagImg(false)
            this.toggleTooltip(true);
        }
    },
    toggleFlagImg: function(hasFlag, imgId = '') {
        if(hasFlag){
            this.flagElement.setAttribute('src', `${this.baseUrlCdn}${imgId}`);
            this.flagElement.classList.remove('d-none');
            this.flagDefaultIcon.classList.add('d-none')
        } else {
            this.flagElement.classList.add('d-none');
            this.flagDefaultIcon.classList.remove('d-none')
        }
    },
};
let expire = $('#expire');
expire.on('change', () => { 
let expVal = expire.val();
let expValues = expVal.split('/');
let date_year = new Date();
let year = date_year.getFullYear().toString();
let yearSliced = year.slice(-2);
 if(expValues[0] > 12){ 
    toastr.error('Insira um mês valido');
 
 }
 if(expValues[1] < yearSliced){ 
    toastr.error('Ano menor que o ano atual')
 } 
});
var payments = new payments();